import { ref, onMounted } from 'vue';
import { ElMessage } from 'element-plus';

/**
 * 表格页面通用 Mixin，提供通用的分页、搜索、重置等方法
 * @param {Function} fetchData - 获取数据的方法，必须返回 Promise
 * @param {Object} options - 配置选项
 * @returns {Object} - 返回表格页面所需的属性和方法
 */
export function useTableMixin(fetchData, options = {}) {
  // 默认配置
  const defaultOptions = {
    pageSize: 10,
    pageSizes: [10, 20, 30, 40],
    defaultSearchParams: {},
    autoLoad: true, // 是否自动加载数据
    transformResponse: null, // 转换响应数据的方法
  };

  // 合并默认配置和用户配置
  const mergedOptions = { ...defaultOptions, ...options };

  // 分页相关
  const currentPage = ref(1);
  const pageSize = ref(mergedOptions.pageSize);
  const total = ref(0);
  const tableData = ref([]);
  const loading = ref(false);

  // 搜索相关
  const searchParams = ref({ ...mergedOptions.defaultSearchParams });

  // 获取数据
  const getDataList = async (params = {}) => {
    loading.value = true;
    try {
      // 合并搜索参数和分页参数
      const queryParams = {
        ...searchParams.value,
        ...params,
        page: currentPage.value - 1, // 后端分页通常从0开始
        size: pageSize.value,
      };

      const response = await fetchData(queryParams);
      
      if (response.status === 200) {
        // 如果提供了响应转换方法，则使用它处理数据
        if (mergedOptions.transformResponse) {
          const transformedData = mergedOptions.transformResponse(response.data);
          tableData.value = transformedData.list || [];
          total.value = transformedData.total || 0;
        } else {
          // 假设后端返回的是标准分页格式
          tableData.value = response.data.content || [];
          total.value = Number(response.data.totalElements || 0);
        }
      } else {
        ElMessage.error(response.message || '获取数据失败');
      }
    } catch (error) {
      console.error('获取数据失败:', error);
      ElMessage.error('获取数据失败');
    } finally {
      loading.value = false;
    }
  };

  // 处理搜索
  const handleSearch = (params = {}) => {
    currentPage.value = 1; // 搜索时重置为第一页
    searchParams.value = { ...params };
    getDataList(params);
  };

  // 处理重置
  const handleReset = () => {
    currentPage.value = 1;
    searchParams.value = { ...mergedOptions.defaultSearchParams };
    getDataList();
  };

  // 处理页面大小变化
  const handleSizeChange = (size) => {
    pageSize.value = size;
    getDataList();
  };

  // 处理页码变化
  const handleCurrentChange = (page) => {
    currentPage.value = page;
    getDataList();
  };

  // 删除操作
  const handleDelete = async (row, deleteFunc, successCallback) => {
    try {
      const res = await deleteFunc([row.id]);
      if (res.status === 200) {
        ElMessage.success('删除成功');
        // 如果当前页只有一条数据且不是第一页，则跳转到上一页
        if (tableData.value.length === 1 && currentPage.value > 1) {
          currentPage.value -= 1;
        }
        if (successCallback) {
          successCallback();
        } else {
          getDataList();
        }
      } else {
        ElMessage.error(res.message || '删除失败');
      }
    } catch (error) {
      console.error('删除失败:', error);
      ElMessage.error('删除失败');
    }
  };

  // 自动加载数据
  if (mergedOptions.autoLoad) {
    onMounted(() => {
      getDataList();
    });
  }

  return {
    // 数据
    currentPage,
    pageSize,
    total,
    tableData,
    loading,
    searchParams,
    
    // 方法
    getDataList,
    handleSearch,
    handleReset,
    handleSizeChange,
    handleCurrentChange,
    handleDelete,
  };
}

export default useTableMixin;